package cn.tedu.tmall.front.content.service.impl;

import cn.tedu.tmall.common.pojo.PageData;
import cn.tedu.tmall.front.content.persist.respository.IArticleRepository;
import cn.tedu.tmall.front.content.pojo.po.ArticlePO;
import cn.tedu.tmall.front.content.pojo.vo.ArticleVo;
import cn.tedu.tmall.front.content.service.IArticleService;
//import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class ArticleServiceImpl implements IArticleService {

    @Autowired
    private IArticleRepository articleRepository;

    @Override
    public PageData<ArticleVo> getArticleByCategoryId(Long categoryId, Integer pageNum,Integer pageSize) {
       //通过参数去rep获取PageData<PO>
        //PageHelper.startPage(pageNum,pageSize);
        // 这行分页代码能不能写到这里?
        // 是写到service 里面 ?
        // 还是写到Repository里 ?
        // 不能 为什么?
        //    1 你不好保证有人在Repository层的查询方法之前写代码.如果写了不挨着了.
        //    2 service 只处理业务,数据的操作委托给了Repository,
        //     Service需要知道Repository是通过什么工具分页的么?
        //      不需要 不关心,如果将来Repository要换分页工具,不用PageHelper了
        //     我们的service 也需要跟着修改.
        //   Repository 的变化导致了 service 也跟着变 耦合
        // 好处是 解耦
        // 同学疑问?原来三层,现在四层,性能会不会降低?
        //   解耦比节省的几纳秒或者微秒更重要
        //挨着
        //PageHelper.startPage(pageNum,pageSize);
        //保证这个里面不能加代码
        PageData<ArticlePO> articlePOPageData =
                articleRepository.getArticleByCategoryId(categoryId,pageNum,pageSize);
        //挨着


        //定义业务数据List<VO>
        List<ArticleVo> articleVoList = new ArrayList<>();
        //从PageData<PO>通过getList方法获取业务数据 循环,一个一个的把PO转为VO
        for (ArticlePO articlePO : articlePOPageData.getList()) {
            ArticleVo articleVo = new ArticleVo();
            BeanUtils.copyProperties(articlePO,articleVo);
            articleVoList.add(articleVo);
        }
        //定义返回结果
        PageData<ArticleVo> pageData = new PageData<>();
        //拷贝分页数据
        BeanUtils.copyProperties(articlePOPageData,pageData);
        //设置业务数据 List<VO>
        pageData.setList(articleVoList);
        //返回结果
        return pageData;
    }

    @Override
    public ArticleVo getArticleById(Long articleId) {
        ArticlePO articlePO = articleRepository.getArticleById(articleId);
        ArticleVo articleVo = new ArticleVo();
        BeanUtils.copyProperties(articlePO,articleVo);
        return articleVo;
    }
}
